/*
	试题 基础练习 Huffuman树
     
	资源限制
		内存限制：512.0MB   C/C++时间限制：1.0s   Java时间限制：3.0s   Python时间限制：5.0s
	
	问题描述
　　	Huffman树在编码中有着广泛的应用。在这里，我们只关心Huffman树的构造过程。
　　	给出一列数{pi}={p0, p1, …, pn-1}，用这列数构造Huffman树的过程如下：
　　		1. 找到{pi}中最小的两个数，设为pa和pb，将pa和pb从{pi}中删除掉，然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。
　　		2. 重复步骤1，直到{pi}中只剩下一个数。
　　	在上面的操作过程中，把所有的费用相加，就得到了构造Huffman树的总费用。
　　	本题任务：对于给定的一个数列，现在请你求出用该数列构造Huffman树的总费用。

　　	例如，对于数列{pi}={5, 3, 8, 2, 9}，Huffman树的构造过程如下：
　　		1. 找到{5, 3, 8, 2, 9}中最小的两个数，分别是2和3，从{pi}中删除它们并将和5加入，得到{5, 8, 9, 5}，费用为5。
　　		2. 找到{5, 8, 9, 5}中最小的两个数，分别是5和5，从{pi}中删除它们并将和10加入，得到{8, 9, 10}，费用为10。
　　		3. 找到{8, 9, 10}中最小的两个数，分别是8和9，从{pi}中删除它们并将和17加入，得到{10, 17}，费用为17。
　　		4. 找到{10, 17}中最小的两个数，分别是10和17，从{pi}中删除它们并将和27加入，得到{27}，费用为27。
　　		5. 现在，数列中只剩下一个数27，构造过程结束，总费用为5+10+17+27=59。
	
	输入格式
　　	输入的第一行包含一个正整数n（n<=100）。
　　	接下来是n个正整数，表示p0, p1, …, pn-1，每个数不超过1000。
	
	输出格式
　　	输出用这些数构造Huffman树的总费用。
	
	样例输入
		5
		5 3 8 2 9
	
	样例输出
		59
*/

/*
	思路: 因为要频繁的在一串数据里面找最小的两个数, 所以我们有两种方法:
			法一: 排升序
			法二: 建小堆
		对于法一,缺点就是当我们找到最小的两个数后, 求得的和在放入这一串数据的时候比较麻烦, 所以我们用方法二.
		
		在这里我们不用手动的建一个堆, 可以使用优先级队列 priority_queue.
*/

/*---------------------------------------------------------------------------------------------------------------------------*/

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<functional>
using namespace std;

int main()
{
	int n;
	cin >> n;
	// 仿函数 greater<int> 对应小堆, 要引头文件 functional
	priority_queue<int, vector<int>, greater<int>> pq;
	for (int i = 0; i < n; i++){
		int tmp;
		cin >> tmp;
		pq.push(tmp);
	}
	int cost = 0;
	while (pq.size() > 1){
		int min1 = pq.top();
		pq.pop();
		int min2 = pq.top();
		pq.pop();
		pq.push(min1 + min2);
		cost += min1 + min2;
	}
	cout << cost << endl;
	return 0;
}


/*---------------------------------------------------------------------------------------------------------------------------*/

